public class removeNum {
    //给定数组和一个特定元素，原地算法移除所有相同元素
    public int removeElement(int[] nums, int val) {
        int k = 0;
        int i = 0;
        int j = nums.length - 1;
//        利用双指针判断循环是否结束，原理是：在这个循环中，j下标只有为val时才会前移，而i下标用于检查val,
//        当检查到val时则与j下标位置的值互换，所以，在i下标与j下标相同时，已经结束了最后一次循环，加等号的原因是处理nums.length为1的情况
        while(i <= j){
            if(nums[i] == val){
                while(nums[j] == val && i <= j){
                    j--;
                    if(j < 0){
                        k = 0;
                        break;
                    }
                }
                //交换i下标与j下标
                if(i < j){
                    int tmp = nums[j];
                    nums[j] = nums[i];
                    nums[i] =  tmp;
                }
            }
            i++;
        }
        if(j < 0){
            k = 0;
        }else{
            k = j + 1;
        }
        return k;
    }
}
